﻿namespace StockSharp.Algo.Indicators.Misc
{
	using System.ComponentModel;
	using System.Linq;
	using System;

	using StockSharp.Algo.Indicators.Oscillator;

	/// <summary>
	/// Динамическая средняя переменного индекса (Variable Index Dynamic Average).
	/// </summary>
	/// <remarks>
	/// http://www2.wealth-lab.com/WL5Wiki/Vidya.ashx
	/// http://www.mql5.com/en/code/75 
	/// </remarks>
	[DisplayName("Vidya")]
	[Description("Динамическая средняя переменного индекса (Variable Index Dynamic Average).")]
	public class Vidya : LengthIndicator<decimal>
	{
		private decimal _multiplier;

		private readonly ChandeMomentumOscillator _cmo;

		/// <summary>
		/// Создать индикатор<see cref="Vidya"/>.
		/// </summary>
		public Vidya()
		{
			_cmo = new ChandeMomentumOscillator();
		}

		/// <summary>
		/// Длина периода.
		/// </summary>
		public override int Length
		{
			get
			{
				return _cmo.Length;
			}
			set
			{
				_cmo.Length = value;
				_multiplier = 2m / (Length + 1);
				Reset();
			}
		}

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			var newValue = input.GetValue<decimal>();

			// Вычисляем  СMO
			var cmoValue = _cmo.Process(input).GetValue<decimal>();

			var lastValue = this.GetCurrentValue();

			// Вычисляем Vidya
			if (Buffer.Count > (Length - 1))
			{
				return (newValue - lastValue) * _multiplier * Math.Abs(cmoValue / 100m) + lastValue;
			}
			else if (Buffer.Count < Length - 1)
			{
				Buffer.Add(newValue);
				return lastValue;
			}
			else
			{
				Buffer.Add(newValue);
				return Buffer.Sum() / Length;
			}
		}
	}
}